home *** CD-ROM | disk | FTP | other *** search
/ MacGames Sampler / PHT MacGames Bundle.iso / MacSource Folder / Samples from the CD / Assembly / Mac68k / XAMP.S / CYIOS.S < prev    next >
Encoding:
Text File  |  1985-08-22  |  20.0 KB  |  813 lines  |  [TEXT/Anon]

  1.      IDENT     CYIOS
  2.      OPTION     SUBTTL,CREF
  3.      MODULE
  4.      INCLUDES MACTEXT
  5.      PAGE     ,132
  6. CYIOS     TITLE     CYCLAN SYSTEM INTERFACE ROUTINES.
  7. **     CYIOS - CYCLAN SYSTEM INTERFACE.
  8. *
  9. *     Copyright (c) 1985 by  J. R. Hogue.
  10.  
  11.      ENTRY     IOASM,IOCLS,IOEND,IOINIT,IOINF,IOFSIZ,IOKBDR,IOKBDS
  12.      ENTRY     IOMSG,IOOPEN,IOPUR,IOREAD,IOREADB,IOREADO,IOSFN
  13.      ENTRY     IOWCH,IOWCR,IOWCL,IOWRITE,IOWRITEB,IOWRITEO,IOWRITES
  14.      ENTRY     CREATF,IOOPENR,INFT,IOSUBS,CREA,IOPROP
  15.  
  16. FNFERR     EQU     -43        FILE NOT FOUND
  17. ASM     SPACE     4,10
  18. **     ASM - WRITE APPLICATION RESOURCE FILE.
  19. *
  20. *     ENTRY     A1 - FIT FOR OBJECT FILE.
  21.  
  22. ASM     LEA     ASMA(PC),A0    FILE PARAMETER BLOCK 1
  23.      MOVE.L     A0,A4
  24.      MOVEQ     #$32/4-1,D0
  25. ASM1     CLR.L     (A0)+
  26.      DBF     D0,ASM1
  27.      LEA     ASMA(PC),A0
  28.      LEA     ASMB(PC),A3
  29.      MOVE.L  A3,ioFileName(A0)   MAC.68K APPL FILE NAME
  30.      MOVE.B  #1,ioPermssn(A0)    READ PERMISSION
  31.      _OpenRF
  32.      BNE.S     ASMX        IF FILE NOT AVAILABLE
  33.  
  34.      CLR     D0        OPEN RESOURCE FORK IN WRITE MODE
  35.      BSR     IOPR
  36.      BNE.S     ASMX        IF ERROR ON OPEN
  37.      MOVE.L     A0,A3
  38.      LEA     ASMC(PC),A2    READ/WRITE BUFFER
  39.      MOVEQ     #127,D2    READ/WRITE ONE SECTOR
  40.      ADDQ     #1,D2
  41.  
  42. *     COPY FILE.
  43.  
  44. ASM2     MOVE.L     A4,A0
  45.      MOVE.L     D2,ioByteCount(A0)
  46.      MOVE.L     A2,ioBuffer(A0)
  47.      _Read    
  48.      BNE.S     ASM3        IF END OF FILE
  49.      MOVE.L     A3,A0
  50.      MOVE.L     D2,ioByteCount(A0)
  51.      MOVE.L     A2,ioBuffer(A0)
  52.      _Write            OUTPUT THE BYTES
  53.      BRA     ASM2
  54.  
  55. ASM3     MOVE.L     ioNumDone(A0),D2  REMAINING BYTES
  56.      MOVE.L     A3,A0
  57.      MOVE.L     D2,ioByteCount(A0)
  58.      MOVE.L     A2,ioBuffer(A0)
  59.      _Write            WRITE PARTIAL SECTOR
  60.      _Close            .68K RESOURCE FORK
  61.      MOVE.L    A4,A0
  62.      _Close            APPL LOADER FILE
  63.  
  64. ASMX     RTS
  65.  
  66. ASMA     DS.B     $50        FILE PARAMETER BLOCK 1
  67. ASMB     STR     'MLOAD'    APPL LOADER FILE NAME
  68. ASMC     DS.B     128        SECTOR BUFFER
  69. CLS     SPACE     4,10
  70. **       CLS - CLOSE FILE.
  71. *
  72. *        ENTRY   A1 - FIT.
  73.  
  74. CLS      BSR     FILTF
  75.      BLE     IORET        IF NOT A DISK FILE
  76.      LEA     FFPB(A1),A0
  77.      MOVE.L  A5,-(SP)
  78.      MOVE.L  CurrentA5,A5
  79.      MOVE.L  FBIW(A1),D0
  80.      SUB.L   FBOW(A1),D0
  81.      BLE.S   CLS1        IF NO DATA TO FLUSH
  82.      CMP.B     #2,ioPermssn(A0)
  83.      BNE.S     CLS1        IF NOT IN WRITE MODE
  84.      MOVE.L  FBOW(A1),ioBuffer(A0)  DATA BUFFER
  85.      MOVE.L  D0,ioByteCount(A0)    BYTE COUNT
  86.      _Write            FLUSH FIT BUFFER
  87. CLS1     _Close                   CLOSE FILE
  88.      MOVE.L  (SP)+,A5
  89.      RTS
  90. CREATF     SPACE     4,10
  91. **       CREATF - CREATE A FILE.
  92.  
  93. CREATF   LEA     FFPB(A1),A0
  94.      _Create
  95.      BNE.S   CREX        ;IF ERROR
  96.      _GetFileInfo
  97.      LEA     ioFLUsrWds(A0),A2
  98.      MOVE.L  INFT(PC),(A2)+    ;FILE TYPE
  99.      MOVE.L  CREA(PC),(A2)+    ;FILE CREATOR
  100.      MOVE    #$0,(A2)    ;FLAGS
  101.      _SetFileInfo
  102.      BNE.S   CREX
  103.      NOP
  104. CREX     RTS
  105.  
  106. CREA     DC.L     'Anon'        ;CREATOR NAME
  107. DAT     SPACE     4,10
  108. **       DAT - GET DATE AND TIME.
  109. *
  110. *        ENTRY   A2 - DESTINATION BUFFER.
  111.  
  112. DAT      MOVE.L     A2,A3
  113.      LEA     DTREC(PC),A0    DATE/TIME RECORD
  114.      MOVE.L     Time,D0    SYSTEM TIME
  115.      _Secs2Date
  116.      LEA     D_DATE+1(PC),A2
  117.      MOVEQ     #2,D0
  118.      CLR.L     D1
  119.      MOVE     (A0)+,D1    YEAR
  120.      SUB     #1900,D1
  121.      BSR     DTA
  122.      ADDQ     #1,A2
  123.      MOVEQ     #2,D0
  124.      MOVE     (A0)+,D1    MONTH
  125.      BSR     DTA
  126.      ADDQ     #1,A2
  127.      MOVEQ     #2,D0
  128.      MOVE     (A0)+,D1    DAY
  129.      BSR     DTA
  130.      LEA     D_TIME+1(PC),A2
  131.      MOVEQ     #2,D0
  132.      MOVE     (A0)+,D1    HOUR
  133.      BSR     DTA
  134.      ADDQ     #1,A2
  135.      MOVEQ     #2,D0
  136.      MOVE     (A0)+,D1    MINUTE
  137.      BSR     DTA
  138.      ADDQ     #1,A2
  139.      MOVEQ     #2,D0
  140.      MOVE     (A0)+,D1    SECOND
  141.      BSR     DTA
  142.      MOVEQ     #10+10-1,D0
  143.      LEA     D_DATE(PC),A1
  144. DAT1     MOVE.B     (A1)+,(A3)+    TRANSFER DATE/TIME
  145.      DBF     D0,DAT1
  146.      RTS
  147.  
  148. D_DATE   DC.W     #10H 85/05/08 
  149. D_TIME     DC.W     #10H 22:00:00 
  150. DTREC     DS       7        DATE/TIME RECORD
  151. DTA     SPACE     4,10
  152. **     DTA - DECIMAL TO ASCII.
  153. *
  154. *     ENTRY     D0 - NUMBER OF DIGITS TO CONVERT.
  155. *         D1 - DECIMAL VALUE.
  156. *         A2 - DESTINATION ADDRESS.
  157.  
  158. DTA     LEA     DTAB(PC),A4
  159.      SUBQ     #1,D0
  160. DTA1     MOVE     (A4)+,D5
  161.      MOVEQ     #'0'-1,D6
  162. DTA2     ADDQ.B     #1,D6        SEARCH FOR OUR DIGIT
  163.      SUB     D5,D1
  164.      BCC     DTA2        IF NOT THERE YET
  165.      ADD     D5,D1        BACK UP
  166.      MOVE.B     D6,(A2)+
  167.      DBF     D0,DTA1
  168.      RTS
  169.  
  170. DTAB     DC     10,1        TENS,UNITS
  171. IOPR     SPACE     4,10
  172. **       IOPR - OPEN FILE RESOURCE FORK.
  173. *
  174. *     ENTRY     A1 - FIT ADDRESS.
  175. *             D0 - OPEN TYPE.
  176. *               0 - OPEN EXISTING FILE (WRITE ACCESS)
  177. *               3 - OPEN EXISTING FILE (READ ACCESS).
  178. *
  179. *     EXIT     CCR - .NE. IF ERROR.
  180. *         D0  - ERROR CODE.
  181.  
  182.  
  183. IOPR     LEA     FBFW(A1),A0     RESET BUFFER POINTERS
  184.      MOVE.L  (A0)+,(A0)
  185.      MOVE.L  (A0)+,(A0)
  186.      LEA     FFPB(A1),A0     FILE PARAMETER BLOCK
  187.      BSR     FILTF
  188.      BLE.S   IOPRXX         IF NOT A DISK FILE
  189.      MOVE.L  A5,-(SP)
  190.      MOVE.L  CurrentA5,A5
  191.      MOVEQ   #1,D2        READ PERMISSION
  192.      CMP     #3,D0
  193.      BEQ.S   IOPR1        IF OPEN *READ*
  194.      MOVEQ   #2,D2        WRITE PERMISSION
  195.      TST     D0
  196.      BNE.S   IOPRX        IF NOT OPEN *WRITE*
  197. IOPR1    MOVE.B  D2,ioPermssn(A0)  PERMISSION TYPE
  198.      CLR.L   ioOwnBuf(A0)    USE VOLUME BUFFER
  199.      _OpenRF        OPEN FILE
  200.      BEQ.S   IOPR2        IF FILE OPEN
  201.      CMP     #2,D2
  202.      BNE.S   IOPRX        IF NOT OPEN WRITE
  203.      CMP     #fnFerr,D0
  204.      BNE.S   IOPRX        IF FILE EXISTS
  205.      BSR     CREATF
  206.      BEQ     IOPR1
  207. IOPRX    MOVE.L  (SP)+,A5
  208. IOPRXX   RTS
  209.  
  210. IOPR2     SUBQ     #2,D2
  211.      BNE     IOPRX        IF NOT OPEN WRITE
  212.      _GetFileInfo
  213.      LEA     ioFLUsrWds(A0),A2
  214.      MOVE.L  IOPRA(PC),(A2)+   ;FILE TYPE
  215.      MOVE.L  IOPRB(PC),(A2)+   ;FILE CREATOR
  216.      MOVE    #$0,(A2)    ;FLAGS
  217.      _SetFileInfo
  218.      BRA     IOPRX
  219.  
  220. IOPRA     DC.L     #'APPL'
  221. IOPRB     DC.L     #'CYAN'
  222. PROP     SPACE     4,10
  223. **       PROP - OPEN PRINT DRIVER.
  224.  
  225. PROP     LEA     PRNR(PC),A0    PRINTER RECORD
  226.      MOVE.L     A3,-(SP)
  227.      LEA     PROPN(PC),A3
  228.      TST.B     (A3)
  229.      BNE.S   PROPX        IF ALREADY OPEN
  230.      ST     (A3)
  231.      MOVEQ     #$32/4-1,D0
  232. PROP1     CLR.L     (A0)+
  233.      DBF     D0,PROP1
  234.      LEA     PRNR(PC),A0
  235.      LEA     PROPA(PC),A3
  236.      MOVE.L  A3,ioFileName(A0)   PRINTER OUTPUT PORT
  237.      MOVE.B  #2,ioPermssn(A0)    WRITE PERMISSION
  238.      _Open
  239. PROPX     MOVE.L     (SP)+,A3
  240.      RTS
  241.  
  242. PRNR     DS.B     $32        PRINTER RECORD
  243. PROPA    STR     '.BOut'    PRINTER PORT NAME
  244. PROPN     DS.B     1
  245. SFN     SPACE     4,10
  246. *        SFN - SET FILE NAME.
  247. *
  248. *        ENTRY   A1 - FIT.
  249. *         A3 - FILE NAME (8 CHARACTERS BLANK FILLED).
  250. *         D5 - EXTENSION (3 CHARACTERS RIGHT JUSTIFIED).
  251.  
  252. SFN      MOVEM.L D1/D3/A0/A4/A6,-(SP)
  253.      MOVEQ   #0,D0        CALCULATE FILE NAME LENGTH
  254.      MOVEQ   #' ',D3
  255.      MOVE.L  A3,A2
  256.      LEA     FSTR(A1),A0    BUILD FILE NAME STRING
  257.      MOVE.L  A0,A4
  258.      CLR.B   (A4)+
  259.      MOVEQ   #8-1,D1
  260. SFN1     MOVE.B  (A2)+,D2
  261.      CMP.B   D3,D2
  262.      BEQ.S   SFN2        IF END OF NAME
  263.      MOVE.B  D2,(A4)+
  264.      DBF     D1,SFN1
  265. SFN2     LEA     SFNA(PC),A6
  266.      MOVE.L  D5,(A6)
  267.      ADDQ    #1,A6
  268.      CMP.B   (A6),D3
  269.      BEQ.S   SFN4        IF NO EXTENSION
  270.      MOVE.B  #'.',(A4)+
  271.      MOVEQ   #3-1,D1
  272. SFN3     MOVE.B  (A6)+,D2
  273.      CMP.B   D3,D2
  274.      BEQ.S   SFN4        IF END OF EXTENSION
  275.      MOVE.B  D2,(A4)+
  276.      DBF     D1,SFN3
  277. SFN4     MOVE.L  A4,D0
  278.      SUB.L   A0,D0
  279.      SUBQ    #1,D0
  280.      MOVE.B  D0,(A0)    LENGTH OF FILE NAME
  281.      MOVE.L  A0,FFPB+ioFileName(A1)  PTR
  282.      MOVEM.L (A3),D0/D1
  283.      MOVEM.L D0/D1,FNAM(A1)    FILE NAME
  284.      CLR     FFPB+ioVRefNum(A1)      CLEAR VOLUME REFERENCE NUMBER
  285.      CLR.L   FFPB+ioCompletion(A1)   CLEAR COMPLETION ROUTINE POINTER
  286.      MOVEM.L (SP)+,D1/D3/A0/A4/A6
  287.      RTS
  288. SFNA     DS.B    4
  289. WCR     SPACE     4,10
  290. **       WCR - WRITE CARRIAGE RETURN.
  291. *        WCH - WRITE CHARACTER TO SCREEN.
  292.  
  293. WCR      MOVEQ   #$0D,D0    ;CARRIAGE RETURN
  294. WCH      CMP.B   #$0A,D0
  295.      BEQ.S   WCHXX        ;IF LINE FEED
  296.      MOVEM.L A0/A1/A3/A5/D3,-(SP)
  297.      MOVE.L  CurrentA5,A5
  298.      MOVE    D0,-(SP)
  299.      MOVE    D0,D3
  300.      MOVE.L  INTE(PC),-(SP)    ;HANDLE
  301.      _TEKey
  302.      CMP.B   #$0D,D3
  303.      BEQ.S   WCH1        ;SCROLL UP
  304. WCHX     MOVEM.L (SP)+,A0/A1/A3/A5/D3
  305. WCHXX    RTS
  306.  
  307. *        MOVE LINES UP.
  308.  
  309. WCH1     MOVE.L  INTE(PC),A0    ;LOOK AT TE RECORD
  310.      MOVE.L  (A0),A3
  311.      MOVEQ   #0,D3
  312.      MOVE    teViewRect+W+W(A3),D3
  313.      SUB     teViewRect(A3),D3    ;WINDOW HEIGHT
  314.      DIVU    teLineHite(A3),D3    ;LINES IN WINDOW
  315. WCH2     MOVE    teNLines(A3),D0
  316.      CMP     D3,D0
  317.      BLT     WCHX        ;IF NOT AT BOTTOM OF SCREEN
  318.      MOVE    teLines(A3),teSelStart(A3)   ;DELETE FIRST LINE
  319.      MOVE    teLines+2(A3),teSelEnd(A3)
  320.      MOVE.L  A0,-(SP)
  321.      _TEDelete
  322.      MOVE    D3,D0
  323.      LSL     #1,D0
  324.      LEA     teLines(A3),A0
  325.      MOVE    0(A0,D0),D0    ;START OF LAST DISPLAYABLE LINE
  326.      MOVE    D0,teSelStart(A3)
  327.      MOVE    D0,teSelEnd(A3)
  328.      MOVE.L  INTE(PC),A0
  329.      BRA     WCH2        ;RECHECK JUST IN CASE SCREEN SHRANK
  330. WCL     SPACE     4,10
  331. **     WCL - WRITE CONSOLE LINE.
  332. *
  333.  
  334. WCLB     SUBQ     #1,D0        SKIP LINE FEED AT END OF LINE
  335. WCL     MOVE.L     A5,-(SP)
  336.      MOVE.L     CurrentA5,A5
  337.      SUBQ     #1,D0
  338.      BLE.S     WCL1        NULL LINE
  339.      MOVE.L     A1,-(SP)
  340.      MOVE.L     A0,-(SP)    START OF LINE
  341.      MOVE.L     D0,-(SP)    LENGTH OF LINE
  342.      MOVE.L     INTE(PC),-(SP) TE RECORD
  343.      _TEInsert
  344.      MOVE.L     (SP)+,A1
  345. WCL1     BSR     WCR        WRITE CR
  346.      MOVE.L     (SP)+,A5
  347.      RTS
  348. WPB     SPACE     4,10
  349. **     WPB - WRITE PRINTER BYTES.
  350.  
  351. WPB     MOVE.L     D0,D2        BYTE COUNT
  352.      MOVE.L     A0,A2        LOCATION
  353.      BSR     PROP        OPEN PRINTER
  354.      MOVE.L     D2,ioByteCount(A0)
  355.      MOVE.L     A2,ioBuffer(A0)
  356.      _Write            OUTPUT THE BYTES
  357.      RTS
  358.  
  359. WPOB     LEA     WPOC(PC),A0    WRITE ONE BYTE
  360.      MOVE.B     D0,(A0)
  361.      MOVEQ     #1,D0
  362.      BRA     WPB
  363.  
  364. WPOC     DS.B     1
  365. IOS     SPACE     4,10
  366. **       IOS - I/O AND SYSTEM INTERFACE JUMP TABLE.
  367.  
  368. IOPROP     JMP     PROP(PC)    OPEN PRINTER DRIVER
  369. IOOPENR  JMP     IOPR(PC)    OPEN FILE RESOURCE FORK
  370. IOSUBS   DS     0        START OF I/O VECTOR TABLE
  371. IOASM     JMP     ASM(PC)    WRITE APPL RESOURCE FILE
  372. IOCLS    JMP     CLS(PC)    CLOSE FILE
  373. IODATIM  JMP     DAT(PC)    GET DATE/TIME
  374. IOEND    JMP     ENDP(PC)       END PROGRAM (LAUNCH FINDER)
  375. IOINIT   JMP     INIT(PC)       INITIALIZE I/O ROUTINES
  376. IOINF    JMP     INF(PC)    INITIALIZE FIT
  377. IOFSIZ   JMP     FSIZ(PC)       RETURN FILE SIZE
  378. IOKBDR   JMP     KBDR(PC)       PAUSE FOR KEYBOARD CHARACTER
  379. IOKBDS   JMP     KBDS(PC)       GET KEYBOARD STATUS
  380. IOMSG    JMP     MSG(PC)    ISSUE CONSOLE MESSAGE
  381. IOOPEN   JMP     IOP(PC)    OPEN FILE
  382. IOPUR    JMP     PUR(PC)    ERASE FILE
  383. IOREAD   JMP     FILLBUF(PC)    READ INTO FIT BUFFER
  384. IOREADB  JMP     RDB(PC)    READ BYTES
  385. IOREADO  JMP     RDO(PC)    READ ONE BYTE
  386. IOSFN    JMP     SFN(PC)    RESET FILE NAME INTO FIT
  387. IOWCR    JMP     WCR(PC)    WRITE C/R TO SCREEN
  388. IOWCH    JMP     WCH(PC)    WRITE CHARACTER TO SCREEN
  389. IOWCL     JMP     WCL(PC)    WRITE CONSOLE LINE
  390. IOWRITE  JMP     WRITBUF(PC)    WRITE FROM FIT BUFFER
  391. IOWRITEB JMP     WTB(PC)    WRITE BYTES
  392. IOWRITEO JMP     WTO(PC)    WRITE ONE BYTE
  393. IOWRITES JMP     WTS(PC)    WRITE STRING
  394. IORET     SPACE     4,10
  395. IORET    RTS             RETURN TO CALLER
  396. ENDP      SPACE     4,10
  397. **       ENDP - END PROGRAM.
  398. ENDP
  399.      RTS
  400. FSIZ     SPACE     4,10
  401. **       FSIZ - RETURN FILE SIZE.
  402. *
  403. *        ENTRY   A1 - FIT.
  404.  
  405. FSIZ     CLR.L   D7
  406.      BSR     FILT
  407.      BLE.S   FSIZ1        IF NOT A DISK FILE
  408.      NOP
  409. FSIZ1    RTS
  410. INF     SPACE     4,10
  411. **       INF - INITIALIZE FIT.
  412. *
  413. *        ENTRY   A1 - FIT.
  414. *         A2 - FILE BUFFER ADDRESS.
  415. *         A3 - FILE NAME.
  416. *         D1 - BUFFER SIZE.
  417. *         D5 - FILE NAME EXTENSION.
  418.  
  419. INF      MOVE.L  A1,A0
  420.      AND.L   #$FFFFFF80,D1    ROUND TO EVEN SECTOR
  421.      MOVEQ   #FITL/W-1,D0
  422. INF1     CLR     (A0)+        CLEAR FIT AREA
  423.      DBF     D0,INF1
  424.      MOVE.L  A2,FBFW(A1)    INITIALIZE BUFFER POINTERS
  425.      MOVE.L  A2,FBIW(A1)
  426.      MOVE.L  A2,FBOW(A1)
  427.      ADD.L   D1,A2
  428.      ADDQ.L  #1,A2
  429.      MOVE.L  A2,FBLW(A1)
  430.      BSR     SFN        SET FILE NAME
  431.      RTS
  432. INIT     SPACE     4,10
  433. **       INIT - INITIALIZE I/O ROUTINES.
  434.  
  435. INIT     LEA     INA5(PC),A3
  436.      MOVE.L  A5,(A3)+    A5 = MAC HEAP POINTER
  437.      MOVE.L  A4,(A3)+    TE HANDLE
  438.      MOVE.L  #'    ',(A3)    DEFAULT FILE TYPE
  439.      RTS
  440. INA5     DS.B    4        MACS A5
  441. INTE     DS.B    4        TE HANDLE
  442. INFT     DS.B    4        FILE TYPE
  443. KBDR     SPACE     4,10
  444. **       KBDR - PAUSE FOR KEYBOARD CHARACTER.
  445. *
  446. *        ENTRY   A1 - CONSOLE FIT.
  447.  
  448. KBDR     MOVE    #$100,D2    DELAY COUNT
  449.      MOVE    D2,D3
  450. KBDR1    BSR     KBDS
  451.      BNE.S   KBDR6        IF CHARACTER PRESENT
  452.      DBF     D2,KBDR1
  453.      LEA     KBDRA(PC),A0
  454.      MOVEQ     #4-1,D2
  455. KBDR2     MOVE.B  (A0)+,D0    DISPLAY *MORE*
  456.      BSR     WCH
  457.      DBF     D2,KBDR2
  458. KBDR3    BSR     KBDS        CHECK KEYBOARD STATUS
  459.      BNE.S   KBDR4        IF CHARACTER PRESENT
  460.      DBF     D3,KBDR3
  461. KBDR4     MOVEQ     #4-1,D2
  462. KBDR5     MOVE.B  (A0)+,D0    UNDISPLAY *MORE*
  463.      BSR     WCH
  464.      DBF     D2,KBDR5
  465.      TST     D3
  466.      BLT     KBDR        REPEAT WAIT LOOP
  467. KBDR6    BSR     RDOK        READ KEYBOARD CHARACTER
  468.      RTS
  469.  
  470. KBDRA     DC.L     'MORE'
  471. KBDRB     DC.L     $08080808    BACKSPACES
  472. KBDS     SPACE     4,10
  473. **       KBDS - GET KEYBOARD STATUS.
  474. *
  475. *        EXIT    CCR - .NE. IF CHARACTER PRESENT.
  476.  
  477. KBDS     MOVEM.L A0/A1/A5,-(SP)
  478.      MOVE.L  CurrentA5,A5
  479.      CLR.B   -(SP)
  480.      MOVE    #$0028,-(SP)    GET KEY DOWN EVENTS
  481.      PEA     RDOA(PC)
  482.      _EventAvail
  483.      MOVE.B  (SP)+,D0    GET IF CHARACTER PRESENT
  484.      MOVEM.L (SP)+,A0/A1/A5
  485.      RTS
  486. MSG     SPACE     4,10
  487. **       MSG - DISPLAY CONSOLE MESSAGE.
  488. *
  489. *        ENTRY   A0 - ZERO BYTE TERMINATED MESSAGE.
  490.  
  491. MSG      MOVE.L  A0,A2
  492. MSG1     MOVE.B  (A2)+,D0    GET NEXT CHARACTER
  493.      BEQ.S   MSG2        IF AT END OF MESSAGE
  494.      BSR     WCH
  495.      BRA     MSG1
  496. MSG2     RTS
  497. IOP     SPACE     4,10
  498. **       IOP - OPEN FILE.
  499. *
  500. *        ENTRY   A1 - FIT ADDRESS.
  501. *            D0 - OPEN TYPE.
  502. *             0 - OPEN EXISTING FILE (WRITE ACCESS)
  503. *             1 - CREATE A FILE (ERROR IF ONE EXISTS).
  504. *             2 - OPEN A NEW FILE (OVERWRITES EXISTING FILE).
  505. *             3 - OPEN EXISTING FILE(READ ACCESS).
  506. *
  507. *        EXIT    CCR - .NE. IF ERROR.
  508. *            D0  - ERROR CODE.
  509.  
  510. IOP      LEA     FBFW(A1),A0    RESET BUFFER POINTERS
  511.      MOVE.L  (A0)+,(A0)
  512.      MOVE.L  (A0)+,(A0)
  513.      BSR     FILTF
  514.      BLE.S   IOPXX        IF NOT A DISK FILE
  515.      MOVE.L  A5,-(SP)
  516.      MOVE.L  CurrentA5,A5
  517.      MOVEQ   #1,D2        READ PERMISSION
  518.      CMP     #3,D0
  519.      BEQ.S   IOP3        IF OPEN *READ*
  520.      MOVEQ   #2,D2        WRITE PERMISSION
  521.      CMP     #1,D0
  522.      BLT.S   IOP3        IF OPEN *WRITE*
  523.      _Delete
  524.      BEQ.S   IOP1
  525.      CMP     #FNFERR,D0
  526.      BNE.S   IOPX        IF ERROR ON DELETE
  527. IOP1     BSR     CREATF
  528.      BNE.S   IOPX
  529.      MOVEQ   #2,D2        *WRITE* PERMISSION
  530. IOP3     MOVE.B  D2,ioPermssn(A0)  PERMISSION TYPE
  531.      CLR.L   ioOwnBuf(A0)    USE VOLUME BUFFER
  532.      _Open            OPEN FILE
  533.      BEQ.S   IOPX        IF FILE OPEN
  534.      SUBQ    #2,D2
  535.      BNE.S   IOPX        IF NOT OPEN WRITE
  536.      CMP     #fnFerr,D0
  537.      BEQ.S   IOP1        CREATE FILE
  538. IOPX     MOVE.L  (SP)+,A5
  539. IOPXX    RTS
  540. PUR     SPACE     4,10
  541. **       PUR - PURGE A FILE.
  542. *
  543. *        ENTRY   A1 - FIT.
  544.  
  545. PUR     LEA     FFPB(A1),A0
  546.      _Delete
  547.      RTS
  548. RDB     SPACE     4,10
  549. **       RDB - READ BYTES.
  550. *
  551. *        ENTRY   A0 - DESTINATION BUFFER.
  552. *         A1 - FIT.
  553. *             D0 - BYTE COUNT.
  554. *
  555. *        EXIT    D0 - UNREAD BYTE COUNT IF EOF ENCOUNTERED.
  556.  
  557. RDB      MOVE.L  FBOW(A1),A2
  558.      MOVE.L  D0,D1
  559. RDB1     BLE.S   RDB3        IF ALL DATA READ
  560. RDB2     CMP.L   FBIW(A1),A2
  561.      BNE.S   RDB4        IF DATA IN BUFFER
  562.      BSR     FILLBUF1    LOAD BUFFER
  563.      MOVE.L  FBOW(A1),A2
  564.      BEQ.S   RDB2        IF DATA NOW PRESENT
  565. RDB3     MOVE.L  D1,D0
  566.      RTS
  567. RDB4     MOVE.B  (A2)+,(A0)+
  568.      CMP.L   FBLW(A1),A2
  569.      BLT.S   RDB5        IF NOT AT END OF BUFFER
  570.      MOVE.L  FBFW(A1),A2
  571. RDB5     MOVE.L  A2,FBOW(A1)    UPDATE DATA OUT POINTER
  572.      SUBQ.L  #1,D1
  573.      BRA     RDB1
  574. RDO     SPACE     4,10
  575. **       RDO - READ ONE BYTE.
  576. *
  577. *        ENTRY   A1 - FIT.
  578. *
  579. *        EXIT    D0 - DATA BYTE READ.
  580. *         D1 - MODIFIERS IF KEYBOARD READ.
  581. *         CCR - .EQ. IF NO DATA AVAILABLE.
  582.  
  583. RDO      BSR     FILT
  584.      BLT.S   RDO4        IF PRINTER
  585.      BGT.S   RDO1        IF DISK
  586. RDOK     MOVEM.L A1/A5,-(SP)
  587.      MOVE.L  CurrentA5,A5
  588.      CLR.B   -(SP)
  589.      MOVE    #$0028,-(SP)    GET KEY DOWN EVENTS
  590.      PEA     RDOA(PC)
  591.      _GetNextEvent
  592.      MOVE.B  (SP)+,D0
  593.      MOVEM.L (SP)+,A1/A5
  594.      BEQ.S   RDO4        IF NO DATA AVAILABLE
  595.      MOVE    RDOA+14(PC),D1    MODIFIERS
  596.      MOVE.L  RDOA+W(PC),D0
  597.      RTS
  598. RDO1     MOVE.L  FBOW(A1),A0
  599.      CMP.L   FBIW(A1),A0
  600.      BEQ.S   RDO3        IF BUFFER EMPTY
  601.      MOVE.B  (A0)+,D0    GET BYTE
  602.      CMP.L   FBLW(A1),A0
  603.      BLT.S   RDO2        IF NOT AT BUFFER LIMIT
  604.      MOVE.L  FBFW(A1),A0
  605. RDO2     MOVE.L  A0,FBOW(A1)
  606.      RTS
  607. RDO3     BSR     FILLBUF1
  608.      BEQ     RDO1        IF DATA NOW IN BUFFER
  609. RDO4     CLR.B   D0        SET NO DATA
  610.      RTS
  611. RDOA     DS.B     16        EVENT RECORD
  612. WTB      SPACE     4,10
  613. **       WTB - WRITE BYTES.
  614. *
  615. *        ENTRY   A0 - SOURCE BUFFER.
  616. *         A1 - FIT.
  617. *         D0 - BYTE COUNT.
  618. *
  619. *        EXIT    CCR - .EQ. IF NO ERRORS.
  620. *         D1  - ERROR CODE IF ERRORS.
  621.  
  622. WTB      MOVE.L  D2,-(SP)
  623.      MOVE.L  D0,D2
  624.      SUBQ.L  #1,D2
  625.      BLT.S   WTB2        IF NULL BYTE COUNT
  626.      BSR     FILT
  627.      BGT.S   WTB3        IF DISK FILE
  628.      BEQ.S     WTB0        IF CONSOLE
  629.      BSR     WPB        WRITE TO PRINTER
  630.      BRA.S     WTB2
  631.  
  632. WTB0     MOVE.B     0(A0,D2),D1
  633.      CMP.B     #$0A,D1
  634.      BNE.S     WTB0.2        CHECK FOR LINE ENDING IN CR/LF
  635.      MOVE     D2,D0
  636. WTB0.1     BSR     WCL        WRITE ENTIRE LINE
  637.      BRA.S     WTB2
  638.  
  639. WTB0.2     CMP.B     #0D,D1
  640.      BEQ     WTB0.1
  641. WTB1     MOVE.B  (A0)+,D0
  642.      BSR     WCH
  643.      DBF     D2,WTB1
  644. WTB2     MOVE.L  (SP)+,D2    RESTORE SAVED REGISTER
  645.      CLR     D1
  646.      RTS
  647.  
  648. WTB3     MOVE.L  FBIW(A1),A2
  649. WTB4     BLT.S   WTB2        IF ALL DATA WRITTEN
  650. WTB5     MOVE.L  A2,D0
  651.      ADDQ.L  #1,D0        ADVANCE DATA IN POINTER
  652.      CMP.L   FBLW(A1),D0
  653.      BLT.S   WTB6        IF NOT AT END OF BUFFER
  654.      MOVE.L  FBFW(A1),D0
  655. WTB6     CMP.L   FBOW(A1),D0
  656.      BNE.S   WTB7        IF BUFFER NOT FULL
  657.      MOVE.L  A0,-(SP)
  658.      MOVE.L  D0,-(SP)
  659.      BSR     WRITBUF1    WRITE BUFFER
  660.      BNE.S   WTBER        IF ERROR
  661.      MOVE.L  (SP)+,D0
  662.      MOVE.L  (SP)+,A0
  663.      BRA     WTB3
  664. WTB7     MOVE.B  (A0)+,(A2)+    STUFF CHARACTER INTO BUFFER
  665.      MOVE.L  D0,A2
  666.      MOVE.L  A2,FBIW(A1)
  667.      SUBQ.L  #1,D2
  668.      BRA     WTB4
  669. WTBER    ADDQ    #8,SP
  670.      MOVE.L  (SP)+,D2
  671.      MOVE    D0,D1        SET ERROR CODE
  672.      RTS
  673. WTO     SPACE     4,10
  674. **       WTO - WRITE ONE BYTE.
  675. *
  676. *        ENTRY   A1 - FIT.
  677. *         D0 - CHARACTER TO WRITE.
  678. *
  679. *        EXIT    CCR - .EQ. IF NO ERROR.
  680. *         D1  - ERROR CODE.
  681.  
  682. WTO      BSR     FILT
  683.      BGT.S   WTO5        IF DISK
  684.      BEQ.S     WTO4        IF CONSOLE
  685.      BSR     WPOB        WRITE PRINTER BYTE
  686. WTO3     CLR     D1
  687.      RTS
  688.  
  689. WTO4     BSR     WCH
  690.      BRA     WTO3
  691.  
  692. WTO5     MOVE.L  FBIW(A1),A0
  693.      MOVEQ   #1,D1
  694.      ADD.L   A0,D1
  695.      CMP.L   FBLW(A1),D1
  696.      BLT.S   WTO6        IF NOT AT END OF BUFFER
  697.      MOVE.L  FBFW(A1),D1
  698. WTO6     CMP.L   FBOW(A1),D1
  699.      BNE.S   WTO7        IF BUFFER NOT FULL
  700.      BSR     WRITBUF1
  701.      BNE.S   WTO8        IF ERROR ON WRITE
  702.      BRA     WTO4
  703. WTO7     MOVE.B  D0,(A0)    STORE CHARACTER
  704.      MOVE.L  D1,FBIW(A1)    UPDATE BUFFER PTR
  705.      CLR     D0
  706. WTO8     RTS
  707. WTS     SPACE     4,10
  708. **       WTS - WRITE STRING.
  709. *
  710. *        ENTRY   A0 - ZERO BYTE TERMINATED STRING.
  711. *         A1 - FIT.
  712. *
  713. *        EXIT    CCR - .NE. IF ERROR.
  714. *         D1  - ERROR CODE.
  715. *
  716.  
  717. WTS      MOVE.L  A0,A2
  718. WTS1     MOVE.B  (A2)+,D0
  719.      BEQ.S   WTS2        IF END OF STRING
  720.      BSR     WTO        WRITE BYTE
  721.      BNE.S   WTS2        IF ERROR
  722.      BRA     WTS1
  723. WTS2     RTS
  724. FILLBUF     SPACE     4,10
  725. **       FILLBUF - READ SECTOR(S) FROM DISK.
  726. *
  727. *        EXIT    CCR - .NE. IF FILE EMPTY.
  728.  
  729. FILLBUF  BSR     FILT
  730.      BLE.S   FILL4        IF NOT DISK
  731. FILLBUF1 MOVEM.L A0/A5/D1/D3,-(SP)  SAVE REGISTERS
  732.      LEA     FFPB(A1),A0     FILE PARAMETER BLOCK
  733.      MOVE.L  FBFW(A1),D1     RESET BUFFER POINTERS
  734.      MOVE.L  D1,FBIW(A1)
  735.      MOVE.L  D1,FBOW(A1)
  736.      MOVE.L  #128,D3
  737. FILL1    MOVE.L  A5,-(SP)
  738.      MOVE.L  CurrentA5,A5
  739.      MOVE.L  FBIW(A1),ioBuffer(A0)   READ BUFFER
  740.      MOVE.L  D3,ioByteCount(A0)     BYTE COUNT
  741.      _Read
  742.      MOVE.L  (SP)+,A5
  743.      BNE.S   FILL5        IF ERROR ON READ
  744.      ADD.L   #128,FBIW(A1)    ADVANCE PTR BY ONE SECTOR
  745.      MOVE.L  FBLW(A1),D0
  746.      SUBQ.L  #1,D0
  747.      CMP.L   FBIW(A1),D0
  748.      BGT     FILL1        IF BUFFER NOT FULL
  749. FILL2    CLR.L   D0
  750. FILL3    MOVEM.L (SP)+,A0/A5/D1/D3
  751.      TST.L   D0
  752. FILL4    RTS
  753. FILL5    MOVEQ   #1,D0
  754.      MOVE.L  ioNumDone(A0),D3   ACTUAL BYTE COUNT READ
  755.      ADD.L   D3,FBIW(A1)
  756.      MOVE.L  FBIW(A1),D3
  757.      SUB.L   FBFW(A1),D3
  758.      BNE     FILL2        IF DATA READ
  759.      BRA     FILL3
  760. FILT     SPACE     4,10
  761. **       FILT - DETERMINE DEVICE TYPE.
  762. *
  763. *        ENTRY   A1 - FIT.
  764. *
  765. *        EXIT    CCR -  .GT. IF DISK FILE.
  766. *            .EQ. IF CONSOLE.
  767. *            .LT. IF PRINTER.
  768.  
  769. FILTF    LEA     FFPB(A1),A0    SET FILE PARAMETER BLOCK
  770.      MOVE.L  A0,D1
  771. FILT     CMP.L   #'CON:',FNAM(A1)
  772.      BEQ.S   FLT2        IF CONSOLE
  773.      CLR     -(SP)
  774.      CMP.L   #'LST:',FNAM(A1)
  775.      BEQ.S   FLT1        IF PRINTER
  776.      MOVE    #2,(SP)
  777. FLT1     SUBQ    #1,(SP)+
  778. FLT2     RTS
  779. WRITBUF     SPACE     4,10
  780. **       WRITBUF - WRITE OUT BUFFER.
  781. *
  782. *        ENTRY   A1 - FIT.
  783. *
  784. *        EXIT    CCR - .EQ. IF WRITE OK.
  785. *         D0  - DISK WRITE STATUS.
  786. *         D1  - FCB ADDRESS.
  787.  
  788. WRITBUF  BSR     FILT
  789.      BLE.S   WRT3        IF NOT DISK FILE
  790. WRITBUF1 LEA     FFPB(A1),A0    FPB ADDRESS
  791. WRT1     MOVE.L  A5,-(SP)
  792.      MOVE.L  CurrentA5,A5
  793.      MOVE.L  FBOW(A1),ioBuffer(A0)
  794.      MOVE.L  #128,ioByteCount(A0)
  795.      _Write            WRITE SECTOR
  796.      MOVE.L  (SP)+,A5
  797.      BNE.S   WRT4        IF ERROR ON WRITE
  798.      ADD.L   #128,FBOW(A1)    ADVANCE SECTOR COUNT
  799.      MOVE.L  FBIW(A1),D0
  800.      SUB.L   FBOW(A1),D0
  801.      BEQ.S   WRT2        IF EMPTY
  802.      BMI.S   WRT4        IF PTRS OFF SHOULD NOT HAPPEN
  803.      CMP.L   #128,D0
  804.      BGE     WRT1        IF BUFFER NOT EMPTY
  805.      BRA.S   WRT3
  806. WRT2     MOVE.L  FBFW(A1),D0    RESET PTRS
  807.      MOVE.L  D0,FBIW(A1)
  808.      MOVE.L  D0,FBOW(A1)
  809. WRT3     CLR     D0
  810. WRT4     RTS
  811.  
  812.      END
  813.